﻿using System;
using System.Collections;
using System.Linq;
using System.Text;
using System.IO;
using Tibet.Entidades;

namespace Tibet.Logica
{
    class LogicaReglaInterface : Regla
    {   
        //Atributos

        private int _tipo;
         
        //Propiedades

        public int Tipo
        {
            get { return _tipo; }
            set { _tipo = value; }
        }
       
        //Metodos
        public LogicaReglaInterface(int tipo)
        {
            //Constructor
            Tipo = tipo; 
        }

        override public Resultado Aplicar(ArrayList archivo)
        {
            try
            {
                if (Tipo == 1)
                    return INombreinterface(archivo);
                if (Tipo == 2)
                    return Nombreinterface(archivo);
                if (Tipo == 3)
                    return Inombreinterface(archivo);
                return null;              
            }
            catch (Exception e)
            {
                return null;
            }
        }


        private static Resultado INombreinterface(ArrayList archivo)
        /*Valida el nombre de la clase empiece con I mayuscula, y la siguiente con mayuscula.
        Ejemplo: INombreinterface      
        */
        {
            //Variables iniciales
            int AnchoLinea; //Guardara el tamaño de cada linea del archivo.
            int i = 0;      //Contador de iteraciones para los ciclos (for).
            int LineaActual = 0; //Linea actual que se esta leyendo.
            Resultado Resp = new Resultado(); //Objeto resultado que sera retornado.

            //Inicializamos Resp asumiendo que el archivo cumple con la regla.
            Resp.Fecha = new DateTime();
            Resp.Fecha = DateTime.Now;
            Resp.Respuesta = true;
            Resp.Mensaje = "No se encontraron errores";
            Resp.Linea = 0;

            try
            {
                foreach (string linea in archivo) //Recorro la lista linea por linea
                {
                    LineaActual++;                //Aumenta el contador de la linea.
                    if (linea.Length != 0)        //Si la linea no esta vacia.
                    {
                        AnchoLinea = linea.Length;//Guardamos la cantidad de espacios de la linea.
                        i = 0;                    //Reiniciamos el contador.
                        while (i < AnchoLinea)    //Recorremos la linea caracter por caracter.
                        {
                            if (linea[i] == 'i') // Si encontramos un abrir de interface, de alli se compara cada letra de la palabra interface
                            {
                             if (linea[i + 1] == 'n')   
                             {
                               if (linea[i + 2] == 't')
                               {
                                if (linea[i + 3] == 'e')
                                {
                                  if (linea[i + 4] == 'r')
                                  {
                                   if (linea[i + 5] == 'f')
                                   {
                                    if (linea[i + 6] == 'a')
                                    {
                                     if (linea[i + 7] == 'c')
                                     {
                                      if (linea[i + 8] == 'e')
                                      {
                                       if (linea[i + 9] == ' ') //se compara que exista espacio en blacno entre interface y el nobre de la interface
                                       {
                                           int j = 10;
                                           int cont;
                                           string inicial = linea[j].ToString();
                                           string nombreInterface = linea[j+1].ToString();
                                           string mayuscula = nombreInterface.ToUpper();
                                           string nombre = "I";
                                           bool x = inicial.Equals(nombre);
                                           bool y = nombreInterface.Equals(mayuscula);
                                           if (x == true) //valida que inicie en I Mayuscula
                                           {
                                               if (y == true) //valida que despues de la I inicie el nombre en Mayuscula
                                               {
                                                   Resp.Linea = LineaActual;    
                                                   Resp.Respuesta = true;           
                                                   Resp.Mensaje = "Existe buen nombramiento de interface en el archivo en la linea " + LineaActual +
                                                       ", con la inicial I seguido del nombre en mayuscula, ejemplo: public interface INombreinterface ";
                                                   /*se verifico que si iniciaba con I y le seguia el nombre iniciando en Mayuscula
                                                   se emite mensaje indicando el exito del nombre de la interface */
                                                   return Resp;
                                               }
                                               Resp.Linea = LineaActual;
                                               Resp.Respuesta = false;
                                               Resp.Mensaje = "No existe buen nombramiento de interface en el archivo en la linea " + LineaActual +
                                                   ", aunque inicia con I, el nombre no inicia en Mayuscula, ejemplo: public interface Inombreinterface ";
                                                 /*aunque se verifico que si iniciaba con I no le seguia el nombre iniciando en Mayuscula
                                                   se emite mensaje indicando el error del nombre de la interface */
                                               return Resp;
                                           }
                                           Resp.Linea = LineaActual;
                                           Resp.Respuesta = false;
                                           Resp.Mensaje = "No existe buen nombramiento de interface en el archivo en la linea " + LineaActual +
                                               ", no inicia con I, ejemplo: public interface Inombreinterface ";
                                           /*aunque se verifico que si iniciaba con I no le seguia el nombre iniciando en Mayuscula
                                             se emite mensaje indicando el error del nombre de la interface */
                                           return Resp;
                                       }
                                      }
                                     }
                                    }
                                   }
                                  }
                                 }
                                }
                               }
                             }
                            i++;
                        }

                    }

                }
                return Resp; //Retornamos respuesta.
            }
            catch (Exception e)
            {
                Resp.Linea = LineaActual;
                Resp.Respuesta = false;
                Resp.Mensaje = "Ocurrio un error inesperado al leer la linea " + LineaActual + ". Error " + e.Message;
                return Resp;
            }
        }

        private static Resultado Nombreinterface(ArrayList archivo)
        /*Valida el nombre de la interface empiece con mayuscula y sin I.
         Ejemplo: Nombreinterface         
        */
        {
            //Variables iniciales
            int AnchoLinea; //Guardara el tamaño de cada linea del archivo.
            int i = 0;      //Contador de iteraciones para los ciclos (for).
            int LineaActual = 0; //Linea actual que se esta leyendo.
            Resultado Resp = new Resultado(); //Objeto resultado que sera retornado.

            //Inicializamos Resp asumiendo que el archivo cumple con la regla.
            Resp.Fecha = new DateTime();
            Resp.Fecha = DateTime.Now;
            Resp.Respuesta = true;
            Resp.Mensaje = "No se encontraron errores";
            Resp.Linea = 0;

            try
            {
                foreach (string linea in archivo) //Recorro la lista linea por linea
                {
                    LineaActual++;                //Aumenta el contador de la linea.
                    if (linea.Length != 0)        //Si la linea no esta vacia.
                    {
                        AnchoLinea = linea.Length;//Guardamos la cantidad de espacios de la linea.
                        i = 0;                    //Reiniciamos el contador.
                        while (i < AnchoLinea)    //Recorremos la linea caracter por caracter.
                        {
                            if (linea[i] == 'i') // Si encontramos un abrir de interface, de alli se compara cada letra de la palabra interface
                            {
                              if (linea[i + 1] == 'n')
                              {
                                if (linea[i + 2] == 't')
                                {
                                  if (linea[i + 3] == 'e')
                                  {
                                    if (linea[i + 4] == 'r')
                                    {
                                      if (linea[i + 5] == 'f')
                                      {
                                       if (linea[i + 6] == 'a')
                                        {
                                         if (linea[i + 7] == 'c')
                                         {
                                           if (linea[i + 8] == 'e')
                                           {
                                             if (linea[i + 9] == ' ') //se compara que exista espacio en blacno entre interface y el nobre de la interface
                                             {
                                                int j = 10;
                                                int cont;
                                                string nombreInterface = linea[j].ToString();
                                                string mayuscula = nombreInterface.ToUpper();
                                                string inicial = "I";
                                                bool y = nombreInterface.Equals(mayuscula);
                                                bool x = nombreInterface.Equals(inicial);
                                                if (y == true) //valida que inicie en Mayuscula
                                                {
                                                    if (x == false)
                                                    {
                                                        Resp.Linea = LineaActual;
                                                        Resp.Respuesta = true;
                                                        Resp.Mensaje = "Existe buen nombramiento de interface en el archivo en la linea " + LineaActual +
                                                            ", el nombre incicia con mayuscula, ejemplo: public interface Nombreinterface ";
                                                        /*se verifico que si iniciaba con I y le seguia el nombre iniciando en Mayuscula
                                                        se emite mensaje indicando el exito del nombre de la interface */
                                                        return Resp;
                                                    }
                                                    Resp.Linea = LineaActual;
                                                    Resp.Respuesta = true;
                                                    Resp.Mensaje = "El nombre de la interfaz en el archivo en la linea " + LineaActual +
                                                        ", no corresponde al modelo public interface Nombreinterface seleccionado ";
                                                    /*se verifico que si iniciaba con I y le seguia el nombre iniciando en Mayuscula
                                                    se emite mensaje indicando el exito del nombre de la interface */
                                                    return Resp;
                                                }

                                                Resp.Linea = LineaActual;
                                                Resp.Respuesta = false;
                                                Resp.Mensaje = "No existe buen nombramiento de interface en el archivo en la linea " + LineaActual +
                                                    ", no inicia con mayuscula, ejemplo: public interface nombreinterface ";
                                                /*aunque se verifico que si iniciaba con I no le seguia el nombre iniciando en Mayuscula
                                                    se emite mensaje indicando el error del nombre de la interface */
                                                return Resp;
                                           }
                                         }
                                       }
                                    }
                                  }
                                }
                              }
                            }
                          }
                        }
                      i++;
                    }
                  }
                }
                return Resp; //Retornamos respuesta.
            }
            catch (Exception e)
            {
                Resp.Linea = LineaActual;
                Resp.Respuesta = false;
                Resp.Mensaje = "Ocurrio un error inesperado al leer la linea " + LineaActual + ". Error " + e.Message;
                return Resp;
            }

        }

        private Resultado Inombreinterface(ArrayList archivo)
        /*Valida el nombre de la interface empiece con mayuscula y sin I.
        Ejemplo: Inombreinterface         
        */
        {
            //Variables iniciales
            int AnchoLinea; //Guardara el tamaño de cada linea del archivo.
            int i = 0;      //Contador de iteraciones para los ciclos (for).
            int LineaActual = 0; //Linea actual que se esta leyendo.
            Resultado Resp = new Resultado(); //Objeto resultado que sera retornado.

            //Inicializamos Resp asumiendo que el archivo cumple con la regla.
            Resp.Fecha = new DateTime();
            Resp.Fecha = DateTime.Now;
            Resp.Respuesta = true;
            Resp.Mensaje = "No se encontraron errores";
            Resp.Linea = 0;

            try
            {
                foreach (string linea in archivo) //Recorro la lista linea por linea
                {
                    LineaActual++;                //Aumenta el contador de la linea.
                    if (linea.Length != 0)        //Si la linea no esta vacia.
                    {
                        AnchoLinea = linea.Length;//Guardamos la cantidad de espacios de la linea.
                        i = 0;                    //Reiniciamos el contador.
                        while (i < AnchoLinea)    //Recorremos la linea caracter por caracter.
                        {
                            if (linea[i] == 'i') // Si encontramos un abrir de interface, de alli se compara cada letra de la palabra interface
                            {
                             if (linea[i + 1] == 'n')
                             {
                              if (linea[i + 2] == 't')
                              {
                               if (linea[i + 3] == 'e')
                               {
                                 if (linea[i + 4] == 'r')
                                 {
                                  if (linea[i + 5] == 'f')
                                  {
                                   if (linea[i + 6] == 'a')
                                   {
                                    if (linea[i + 7] == 'c')
                                     {
                                      if (linea[i + 8] == 'e')
                                       {
                                        if (linea[i + 9] == ' ') //se compara que exista espacio en blacno entre interface y el nobre de la interface
                                        {
                                            int j = 10;
                                            int cont;
                                            string inicial = linea[j].ToString();
                                            string nombreInterface = linea[j + 1].ToString();
                                            string minuscula = nombreInterface.ToLower();
                                            string nombre = "I";
                                            bool x = inicial.Equals(nombre);
                                            bool y = nombreInterface.Equals(minuscula);
                                            if (x == true) //valida que inicie en I Mayuscula
                                            {
                                                if (y == true) //valida que despues de la I inicie el nombre en Mayuscula
                                                {
                                                    Resp.Linea = LineaActual;
                                                    Resp.Respuesta = true;
                                                    Resp.Mensaje = "Existe buen nombramiento de interface en el archivo en la linea " + LineaActual +
                                                        ", con la inicial I seguido del nombre en minuscula, ejemplo: public interface Inombreinterface ";
                                                    /*se verifico que si iniciaba con I y le seguia el nombre iniciando en Mayuscula
                                                    se emite mensaje indicando el exito del nombre de la interface */
                                                    return Resp;
                                                }
                                                Resp.Linea = LineaActual;
                                                Resp.Respuesta = false;
                                                Resp.Mensaje = "No existe buen nombramiento de interface en el archivo en la linea " + LineaActual +
                                                    ", aunque inicia con I, el nombre no inicia en minuscula, ejemplo: public interface Inombreinterface ";
                                                /*aunque se verifico que si iniciaba con I no le seguia el nombre iniciando en Mayuscula
                                                  se emite mensaje indicando el error del nombre de la interface */
                                                return Resp;
                                            }

                                            Resp.Linea = LineaActual;
                                            Resp.Respuesta = false;
                                            Resp.Mensaje = "No existe buen nombramiento de interface en el archivo en la linea " + LineaActual +
                                                ", no inicia con I mayuscula, ejemplo: public interface nombreinterface ";
                                            /*aunque se verifico que si iniciaba con I no le seguia el nombre iniciando en Mayuscula
                                                se emite mensaje indicando el error del nombre de la interface */
                                            return Resp;
                                        }
                                      }
                                    }
                                  }
                                }
                              }
                            }
                          }
                        }
                      }
                      i++;
                    }
                  }
                }
                return Resp; //Retornamos respuesta.
            }
            catch (Exception e)
            {
                Resp.Linea = LineaActual;
                Resp.Respuesta = false;
                Resp.Mensaje = "Ocurrio un error inesperado al leer la linea " + LineaActual + ". Error " + e.Message;
                return Resp;
            }
        }
     }
}
